home *** CD-ROM | disk | FTP | other *** search
- /*****************************************************************************
- FILE : kr_funcs.c
- SHORTNAME :
- SNNS VERSION : 3.2
-
- PURPOSE : SNNS-Kernel: Management routines for user functions
- NOTES :
-
- AUTHOR : Niels Mache
- DATE : 12.02.90
-
- CHANGED BY : Sven Doering
- IDENTIFICATION : @(#)kr_funcs.c 1.8 3/15/94
- SCCS VERSION : 1.8
- LAST CHANGE : 3/15/94
-
- Copyright (c) 1990-1994 SNNS Group, IPVR, Univ. Stuttgart, FRG
-
- ******************************************************************************/
- #include <string.h>
-
- #include "kr_typ.h" /* Kernel types and constants */
- #include "kr_const.h" /* Kernel constants */
- #include "kr_def.h" /* Default values */
- #include "kr_funcs.ph" /* Function prototypes */
- #include "kernel.h"
- #include "func_tbl.h"
-
-
- /*#################################################
-
- GROUP: MasPar functions
-
- #################################################*/
-
- #ifdef MASPAR_KERNEL
- #ifndef MASPAR_KERNEL_EMULATION
-
- extern krmp_getMasParFuncInfo();
-
- #endif
- #endif
-
-
- /*#################################################
-
- GROUP: Functions
-
- #################################################*/
- /*****************************************************************************
- FUNCTION : krf_getInternalFuncInfo
-
- PURPOSE :
- NOTES :
-
- RETURNS :
- UPDATE :
- ******************************************************************************/
-
- static krui_err krf_getInternalFuncInfo(int mode, struct FuncInfoDescriptor *func_descr)
- {
- struct FuncTable *ftbl_ptr;
- unsigned short func_type;
-
-
- KernelErrorCode = KRERR_NO_ERROR;
-
- switch (mode) {
- case GET_NO_OF_FUNCS:
- func_descr->number = NoOfKernelFuncs;
- break;
-
- case GET_FUNC_INFO: /* return all info about given function */
- if ((func_descr->number < 0) || (func_descr->number >= NoOfKernelFuncs)) {
- KernelErrorCode = KRERR_PARAMETERS;
- return( KernelErrorCode );
- }
-
- ftbl_ptr = kernel_func_table + func_descr->number;
-
- strcpy( func_descr->func_name, ftbl_ptr->func_name );
- func_descr->func_type = ftbl_ptr->func_type & ~DEFAULT_FUNC;
- func_descr->no_of_input_parameters = ftbl_ptr->no_of_input_parameters;
- func_descr->no_of_output_parameters = ftbl_ptr->no_of_output_parameters;
- func_descr->function = ftbl_ptr->function;
-
- break;
-
- case SEARCH_FUNC: /* search for the given function and return the
- info about the function */
-
- for (ftbl_ptr = kernel_func_table;
- ftbl_ptr < kernel_func_table + NoOfKernelFuncs;
- ftbl_ptr++) {
- func_type = func_descr->func_type;
- if ((func_type == (ftbl_ptr->func_type & ~DEFAULT_FUNC)) &&
- (strcmp( func_descr->func_name, ftbl_ptr->func_name ) == 0)) {
- func_descr->no_of_input_parameters = ftbl_ptr->no_of_input_parameters;
- func_descr->no_of_output_parameters = ftbl_ptr->no_of_output_parameters;
- func_descr->function = ftbl_ptr->function;
-
- return( KRERR_NO_ERROR );
- }
- }
-
- func_descr->function = NULL;
-
- switch (func_descr->func_type) {
- case OUT_FUNC:
- KernelErrorCode = KRERR_OUTFUNC;
- break;
- case ACT_FUNC:
- KernelErrorCode = KRERR_ACTFUNC;
- break;
- case SITE_FUNC:
- KernelErrorCode = KRERR_SITEFUNC;
- break;
- case LEARN_FUNC:
- KernelErrorCode = KRERR_LEARNING_FUNC;
- break;
- case UPDATE_FUNC:
- KernelErrorCode = KRERR_UPDATE_FUNC;
- break;
- case INIT_FUNC:
- KernelErrorCode = KRERR_INIT_FUNC;
- break;
- case ACT_DERIV_FUNC:
- KernelErrorCode = KRERR_DERIV_FUNC;
- break;
-
- default:
- KernelErrorCode = KRERR_PARAMETERS;
- }
-
- break;
-
- case GET_FUNC_NAME: /* search for the given function pointer and
- returns the name of the function */
-
- for (ftbl_ptr = kernel_func_table;
- ftbl_ptr < kernel_func_table + NoOfKernelFuncs;
- ftbl_ptr++)
- if (func_descr->function == ftbl_ptr->function) {
- strcpy( func_descr->func_name, ftbl_ptr->func_name );
- func_descr->func_type = ftbl_ptr->func_type & ~DEFAULT_FUNC;
- func_descr->no_of_input_parameters = ftbl_ptr->no_of_input_parameters;
- func_descr->no_of_output_parameters = ftbl_ptr->no_of_output_parameters;
-
- return( KRERR_NO_ERROR );
- }
-
- func_descr->func_type = 0;
- break;
-
- case GET_DEFAULT_FUNC: /* search for the given function type and
- returns the default function of this type */
-
- func_type = func_descr->func_type | DEFAULT_FUNC;
- for (ftbl_ptr = kernel_func_table;
- ftbl_ptr < kernel_func_table + NoOfKernelFuncs;
- ftbl_ptr++) {
- if (func_type == ftbl_ptr->func_type) {
- func_descr->no_of_input_parameters = ftbl_ptr->no_of_input_parameters;
- func_descr->no_of_output_parameters = ftbl_ptr->no_of_output_parameters;
- func_descr->function = ftbl_ptr->function;
- strcpy( func_descr->func_name, ftbl_ptr->func_name );
- func_descr->number = ftbl_ptr - kernel_func_table;
- return( KRERR_NO_ERROR );
- }
- }
-
- func_descr->number = 0;
- KernelErrorCode = KRERR_MISSING_DEFAULT_FUNC;
- break;
-
- default:
- KernelErrorCode = KRERR_PARAMETERS;
- }
-
- return( KernelErrorCode );
- }
-
-
- /*****************************************************************************
- FUNCTION : krf_getFuncInfo
-
- PURPOSE :
- NOTES :
-
- RETURNS :
- UPDATE :
- ******************************************************************************/
-
- krui_err krf_getFuncInfo(int mode, struct FuncInfoDescriptor *func_descr)
- {
- switch (specialNetworkType) {
- case NET_TYPE_GENERAL:
- (void) krf_getInternalFuncInfo( mode, func_descr );
- break;
-
- #ifdef MASPAR_KERNEL
-
- case NET_TYPE_FF1:
-
- #ifndef MASPAR_KERNEL_EMULATION
-
-
- KernelErrorCode = callRequest( krmp_getMasParFuncInfo,
- sizeof (int) +
- sizeof (struct FuncInfoDescriptor *),
- mode, func_descr );
- #else
- (void) krf_getInternalFuncInfo( mode, func_descr );
- #endif
-
- break;
- #endif
-
- default:
- KernelErrorCode = KRERR_PARAMETERS;
- }
-
- return( KernelErrorCode );
- }
-
- /*****************************************************************************
- FUNCTION : krf_getNoOfFuncs
-
- PURPOSE : Returns the number of functions in the function table
- NOTES :
-
- RETURNS : Returns the number of functions in the function table
- UPDATE :
- ******************************************************************************/
- int krf_getNoOfFuncs(void)
- {
- struct FuncInfoDescriptor functionDescr;
-
-
- KernelErrorCode = krf_getFuncInfo( GET_NO_OF_FUNCS, &functionDescr );
- return( functionDescr.number );
- }
-
- /*****************************************************************************
- FUNCTION : krf_funcSearch
-
- PURPOSE : seaches for the given function (name and type) and returns a pointer to
- this function. krf_funcSearch(...)
- NOTES :
-
- RETURNS : TRUE if the given function was found, FALSE otherwise.
- UPDATE :
- ******************************************************************************/
- bool krf_funcSearch(char *func_name, int func_type, FunctionPtr *func_ptr)
- {
- struct FuncInfoDescriptor functionDescr;
-
- functionDescr.func_type = func_type;
- strcpy( functionDescr.func_name, func_name );
-
- KernelErrorCode = krf_getFuncInfo( SEARCH_FUNC, &functionDescr );
-
- if (KernelErrorCode != KRERR_NO_ERROR) return( FALSE );
- *func_ptr = functionDescr.function;
- return( TRUE );
- }
- /*****************************************************************************
- FUNCTION : krf_getFuncName
-
- PURPOSE :
- NOTES :
-
- RETURNS : Returns the name of the given function
- UPDATE :
- ******************************************************************************/
- char *krf_getFuncName(FunctionPtr func_ptr)
- {
- static struct FuncInfoDescriptor functionDescr;
-
- functionDescr.function = func_ptr;
-
- KernelErrorCode = krf_getFuncInfo( GET_FUNC_NAME, &functionDescr );
-
- if (functionDescr.func_type == 0) return( NULL );
-
- return( functionDescr.func_name );
- }
-
-
- /*#################################################
-
- GROUP: Functions for managing current and
- default network functions
-
- #################################################*/
- /*****************************************************************************
- FUNCTION : krf_getCurrentNetworkFunc
-
- PURPOSE :
- NOTES :
-
- RETURNS : returns the name of the current network function
- UPDATE :
- ******************************************************************************/
- char *krf_getCurrentNetworkFunc(int type)
- {
- int sel;
- static struct FuncInfoDescriptor func_descr;
-
-
- KernelErrorCode = KRERR_NO_ERROR;
-
- if (specialNetworkType == NET_TYPE_GENERAL) sel = 0;
- else sel = NO_OF_FUNC_TYPES;
-
- switch (type) {
- case UPDATE_FUNC:
- break;
- case LEARN_FUNC:
- sel += 1;
- break;
- case INIT_FUNC:
- sel += 2;
- break;
- case OUT_FUNC:
- sel += 3;
- break;
- case ACT_FUNC:
- sel += 4;
- break;
- case SITE_FUNC:
- sel += 5;
- break;
- case UPDATE_FUNC | BENCH_FUNC:
- sel += 6;
- break;
- case LEARN_FUNC | BENCH_FUNC:
- sel += 7;
- break;
-
- default:
- KernelErrorCode = KRERR_PARAMETERS;
- return( NULL );
- }
-
- if (netFuncInit[sel]) return( &CurrNetworkFunc[sel][0] );
-
- func_descr.func_type = type;
- if (krf_getFuncInfo( GET_DEFAULT_FUNC, &func_descr ) == KRERR_NO_ERROR)
- return( func_descr.func_name );
-
- return( NULL );
- }
-
- /*****************************************************************************
- FUNCTION : krf_storeCurrentNetworkFunc
-
- PURPOSE :
- NOTES :
-
- RETURNS :
- UPDATE :
- ******************************************************************************/
-
- static void krf_storeCurrentNetworkFunc(char *function_name, int type)
- {
- int sel;
-
- if (specialNetworkType == NET_TYPE_GENERAL) sel = 0;
- else sel = 3;
-
-
- switch (type) {
- case UPDATE_FUNC:
- break;
- case LEARN_FUNC:
- sel += 1;
- break;
- case INIT_FUNC:
- sel += 2;
- break;
- case OUT_FUNC:
- sel += 3;
- break;
- case ACT_FUNC:
- sel += 4;
- break;
- case SITE_FUNC:
- sel += 5;
- break;
- case UPDATE_FUNC | BENCH_FUNC:
- sel += 6;
- break;
- case LEARN_FUNC | BENCH_FUNC:
- sel += 7;
- break;
-
- default:
- KernelErrorCode = KRERR_PARAMETERS;
- return;
- }
-
- netFuncInit[sel] = TRUE;
- strcpy( &CurrNetworkFunc[sel][0], function_name );
- return;
- }
-
-
-
- /*****************************************************************************
- FUNCTION : krf_setCurrentNetworkFunc
-
- PURPOSE : sets the current network function.
- NOTES :
-
- RETURNS :
- UPDATE :
- ******************************************************************************/
- krui_err krf_setCurrentNetworkFunc(char *function_name, int type)
- {
- FunctionPtr func_ptr;
- bool func_has_changed;
- char *current_func;
-
- KernelErrorCode = KRERR_NO_ERROR;
-
- if (!krf_funcSearch( function_name, type, &func_ptr ))
- return( KernelErrorCode );
- if ((current_func = krf_getCurrentNetworkFunc( type )) == NULL)
- return( KernelErrorCode );
-
- func_has_changed = strcmp( function_name, current_func ) != 0;
-
- switch (type) {
- case UPDATE_FUNC:
- if (func_has_changed)
- { /* update function has changed, initialize the network */
- NetInitialize = TRUE;
- krf_storeCurrentNetworkFunc( function_name, type );
- }
-
- return( KernelErrorCode );
-
- case LEARN_FUNC:
- if (func_has_changed)
- { /* Learning function has changed */
- LearnFuncHasChanged = TRUE;
- krf_storeCurrentNetworkFunc( function_name, type );
- }
-
- return( KernelErrorCode );
-
- case INIT_FUNC:
- case OUT_FUNC:
- case ACT_FUNC:
- case SITE_FUNC:
- krf_storeCurrentNetworkFunc( function_name, type );
- break;
-
- default:
- KernelErrorCode = KRERR_PARAMETERS;
- return( KernelErrorCode );
- }
-
- return( KernelErrorCode );
- }
-
-
-
-
-